<?

/**
 * Cliente class
 *
 * Esta clase maneja un cliente
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@elserver.com>
 * @version 1.0
 * @package Clientes
*/
class Cliente extends Core {

	static protected $instancia;
	static protected $opciones = array(
	);
	private $id_cliente = null;
	private $count = 0;

	function __construct ($id_cliente=null, $opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
		// Seteo el id de este cliente
		if ($id_cliente && $this instanceof self)
			$this->id($id_cliente);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Setea y/o devuelve el id de este cliente
	 * 
	 * @param string $id_cliente (Opcional) El id del cliente (si se quiere usar como setter tambien)
	 * @return integer El id del cliente
	 */
	public function id ($id_cliente=null) {

		// Si me paso el id_cliente lo seteo
		if ($id_cliente)
			$this->id_cliente = addslashes($id_cliente);
		
		return $this->id_cliente;
	}

	/**
	 * Cambia el estado de este cliente
	 * 
	 * @param integer $id_estado El nuevo estado para el cliente
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	private function cambiar_estado ($id_estado, $id_cliente=null) {

		// Saneamiento de variables
		$id_estado = addslashes($id_estado);
		$id_cliente = addslashes($id_cliente);
		
		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Cambio el estado del cliente
		$db->update('clientes', array('id_cliente' => $id_cliente, 'id_estado' => $id_estado));

		return true;
	}

	/**
	 * Cambia el estado de este cliente a nuevo
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function nuevo ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_NUEVO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a nuevo') : false;

		return ($this instanceof self)? $this->cambiar_estado(1, $id_cliente) : self::cambiar_estado(1, $id_cliente);
	}

	/**
	 * Cambia el estado de este cliente a contactado
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function contactado ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_CONTACTADO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a contactado') : false;

		return ($this instanceof self)? $this->cambiar_estado(2, $id_cliente) : self::cambiar_estado(2, $id_cliente);
	}

	/**
	 * Cambia el estado de este cliente a cerrado
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function cerrado ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_CERRADO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a cerrado') : false;

		return ($this instanceof self)? $this->cambiar_estado(3, $id_cliente) : self::cambiar_estado(3, $id_cliente);
	}

	/**
	 * Cambia el estado de este cliente a inactivo
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function inactivo ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_INACTIVO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a inactivo') : false;

		return ($this instanceof self)? $this->cambiar_estado(4, $id_cliente) : self::cambiar_estado(4, $id_cliente);
	}

	/**
	 * Modifica los datos de un cliente
	 * 
	 * @param array $cliente Los nuevos datos de este cliente
	 * @param array $id_cliente (Opcional) El id de cliente que se quiere modificar
	 * @return boolean
	 */
	public function modificar ($cliente, $id_cliente=null) {

		// Obtengo el objeto de sesion
		$Session = Session::getInstance();

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
//		if (!$acl->get('CLIENTE', 'MODIFICAR'))
//			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar los datos de un cliente') : false;

		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();
		
		// Actualizo
		$db->update('clientes', array_merge($cliente, array('id_cliente' => $id_cliente)));

		return true;
	}

	/**
	 * Devuelve la informacion de un cliente
	 * 
	 * @param integer $id_cliente (Opcional) El id del cliente del que se quiere la informacion
	 * @return array
	 */
	public function get ($id_cliente=null) {

		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();
		
		// Obtengo el cliente
		$cliente = $db->get_row("SELECT * FROM clientes WHERE id_cliente = '$id_cliente'");

		return $cliente;
	}

	/**
	 * Chequea si existe este cliente en la base
	 * 
	 * @param string $cliente El nombre del cliente que se quiere saber si existe
	 * @return boolean
	 */
	public function existe ($nombre, $apellido) {

		// Saneamiento de variables
		$nombre = addslashes($nombre);
		$apellido = addslashes($apellido);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el cliente
		$info = $db->get_row("SELECT * FROM clientes WHERE nombre = '$nombre' AND apellido = '$apellido'");

		return $info;
	}

	/**
	 * Devuelve el listado de citas de este cliente
	 * 
	 * @param integer $id_cliente (Opcional) El id de cliente del que se quieren las citas
	 * @return boolean
	 */
	public function citas ($id_cliente=null) {

		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Instancio Citas
		$Citas = new Citas();
		
		// Obtengo el listado de citas
		$citas = array();
		if ($_citas = $Citas->listar(array('filtros' => array('c.id_cliente' => 'c.id_cliente = '.$id_cliente))))
			foreach ($_citas['data'] as $_cita)
				$citas[$_cita['pendiente']][$_cita['id_cita']] = $_cita;

		return $citas;
	}

}

?>
